﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Entidades;
using Logica;
using Logica.Comandos.AseguradoraCommand;
using Logica.Comandos.Lugar;
using Logica.Comandos.Sucursal;
using Logica.Fabricas;
using SchadenEscritorio.Contratos;

namespace SchadenEscritorio.Presentadores
{
    public class PresentadorEditarAseguradora: PresentadorBusquedaAseguradora
    {
        #region Atributos

        private IContratoEditarEmpresa _vista;
        private Aseguradora _datos;
        private List<Sucursal> _listaSucursales = new List<Sucursal>();
        private PresentadorLugar _lugar;

        #endregion
        #region Constructor

        public PresentadorEditarAseguradora(IContratoEditarEmpresa vista)
        {
            _vista = vista;
            VistaBuscar = _vista;
            _lugar = new PresentadorLugar(_vista);
        }
        #endregion

        /// <summary>
        /// llena el combobox con las letras del rif
        /// </summary>
        private void CargarLetrasRif()
        {
            _vista.LetraRif.Controls.Clear();
            _vista.LetraRif.Items.Clear();
            _vista.LetraRif.Items.Add('V');
            _vista.LetraRif.Items.Add('E');
            _vista.LetraRif.Items.Add('J');
            _vista.LetraRif.Items.Add('P');
            _vista.LetraRif.Items.Add('G');
        }

        /// <summary>
        /// llena el combobox de los estados
        /// </summary>
        private void CargarEstados()
        {
            _lugar.CargarEstados();
        }

        /// <summary>
        /// carga todas las ciudades en combobox dado un estado
        /// </summary>
        public void CargarCiudades()
        {
            _lugar.CargarCiudades();
        }

        public void CargarUrbanizaciones()
        {
            _lugar.CargarUrbanizaciones();
        }

        public void CargarAvenidas()
        {
            _lugar.CargarAvenidas();
        }

        /// <summary>
        /// llena el datagridview con los datos de la sucursales
        /// </summary>
        private void CargarDatosSucursales()
        {
            Comando comando = FComandos.ComandoSucursal().Consultar();
            Comando comandoLugar = FComandos.ComandoLugar().Consultar();

            foreach (Sucursal sucursal in ((ComandoObtenerSucursales)comando).Ejecutar(_datos.Id))
            { 
                Lugar padre = ((ComandoObtenerDireccion)comandoLugar).Ejecutar(sucursal.Direccion);
                sucursal.Direccion = padre;
                int fila = _vista.Lista.Rows.Add();
                int numero = 0;
                while (true)
                {
                    _vista.Lista.Rows[fila].Cells[numero].Value = padre.Nombre;
                    if( padre.Descendiente == null) break;
                    padre = padre.Descendiente;  
                    numero++;
                }
                _listaSucursales.Add(sucursal);
                _vista.Lista.Rows[fila].Cells[6].Value = sucursal.Telefono1;
                _vista.Lista.Rows[fila].Cells[7].Value = sucursal.Telefono2;
            }
        }
        /// <summary>
        /// agrega los datos de una sucursal en datagridview
        /// </summary>
        public void AgregarSucursal()
        {

            _vista.Lista.Rows.Add(((Lugar)_vista.Estado.SelectedItem).Nombre,
                                ((Lugar)_vista.Ciudad.SelectedItem).Nombre,
                                _vista.Urbanizacion.Text, _vista.Calle.Text, _vista.Edificio.Text,
                                _vista.Piso.Text, _vista.Telefono1.Text, _vista.Telefono2.Text);

            _vista.Lista.Visible = true;

            Lugar estado = (Lugar)_vista.Estado.SelectedItem;
            Lugar ciudad = (Lugar)_vista.Ciudad.SelectedItem;
            Lugar urbanizacion = FabricaEntidades.ObtenerLugar();
            Lugar calle = FabricaEntidades.ObtenerLugar();
            Lugar casa = FabricaEntidades.ObtenerLugar();
            Lugar piso = FabricaEntidades.ObtenerLugar();

            estado.Descendiente = ciudad;

            urbanizacion.Nombre = _vista.Urbanizacion.Text.ToLower();
            urbanizacion.Tipo = "urbanizacion";
            ciudad.Descendiente = urbanizacion;
            calle.Nombre = _vista.Calle.Text.ToLower();
            calle.Tipo = "tipo";
            urbanizacion.Descendiente = calle;
            casa.Nombre = _vista.Edificio.Text.ToLower();
            casa.Tipo = "edificio";
            calle.Descendiente = casa;
            piso.Nombre = _vista.Piso.Text.ToLower();
            piso.Tipo = "piso";
            casa.Descendiente = piso;
            piso.Descendiente = null;

            Sucursal miSucursal = FabricaEntidades.ObtenerSucursal();

            miSucursal.Id = -1;
            miSucursal.Direccion = estado;
            miSucursal.Telefono1 = _vista.Telefono1.Text;
            miSucursal.Telefono2 = _vista.Telefono2.Text;
            miSucursal.Tipo = _vista.Principal.Checked ?
                _vista.Principal.Text : _vista.Secundario.Text;
           _listaSucursales.Add(miSucursal);
        }
        /// <summary>
        /// muestra todos los datos de la ajustadora
        /// </summary>
        /// <param name="id"></param>
        public void MostrarDatos(int id)
        {
            _vista.Lista.Rows.Clear();
            foreach (var aseguradora in Lista)
            {
                if (((Aseguradora)aseguradora).Id == id)
                {
                    _datos = (Aseguradora)aseguradora;
                    break;
                }
            }
            VistaBuscar.PanelBusqueda.Visible = false;
            _vista.Nombre.Text = _datos.Nombre;
            _vista.Rif.Text = _datos.Rif.ToString().ToUpper();
            _vista.Telefono.Text = _datos.Telefono.ToString();
            
            CargarLetrasRif();
            CargarEstados();
            CargarDatosSucursales();
            _vista.LetraRif.SelectedText = _datos.LetraRif.ToString().ToUpper();
        }

        /// <summary>
        /// obtiene los valores del data grid view y los almacena
        /// </summary>
        public void GuardarSucursales()
        {
            for (int i = 0; i < _vista.Lista.Rows.Count; i++)
            {
                int numero = 5;
                Lugar hijo = null;
                while (true)
                {
                    if (numero == -1) break;
                    if(_vista.Lista.Rows[i].Cells[numero].Value != null)
                    {
                        Lugar padre = FabricaEntidades.ObtenerLugar();
                        padre.Nombre = _vista.Lista.Rows[i].Cells[numero].Value.ToString();
                        padre.Tipo = _vista.Lista.Columns[numero].HeaderText;
                        padre.Descendiente = hijo;
                        hijo = padre;
                    }
                    numero--;
                }
                _listaSucursales[i].Direccion = hijo;
                _listaSucursales[i].Telefono1 = _vista.Lista.Rows[i].Cells[6].Value.ToString();
                _listaSucursales[i].Telefono2 = _vista.Lista.Rows[i].Cells[7].Value.ToString();
            }
        }
        public void Guardar()
        {
            Comando comando = FComandos.ComandoAseguradora().Editar();
            GuardarSucursales();
            _datos.Sucursales = _listaSucursales;
            _datos.Rif = Convert.ToInt64(_vista.Rif.Text);
            _datos.LetraRif = Convert.ToChar(_vista.LetraRif.Text);
            _datos.Nombre = _vista.Nombre.Text;
            _datos.Telefono = _vista.Telefono.Text;
            ((ComandoEditarAseguradora) comando).Ejecutar(_datos);
            DialogResult result = MessageBox.Show("Aseguradora Editada Con Exito!!", "OJO", MessageBoxButtons.OK);
            if (result == DialogResult.OK)
            {
                _vista.PanelBusqueda.Visible = true;
            } 
        }
    }
}
